package sync;

/*
synchronized实现线程间通信
 */

//第一步创建资源类，定义属性和操作方法
class share{


//  定义属性和操作方法
  private int number = 1;

//  第二步：判断 干活 通知

//  +1的方法
  public synchronized void incr() throws InterruptedException {
//    判断
    while(number != 0){
      this.wait();//哪里等待，哪里执行，必须放在循环里，不然会出现虚假唤醒
    }
//    干活:当number为0的时候，加一
    number++;
    System.out.println(Thread.currentThread().getName() + "::" + number);
//    通知：当number不为0的时候，通知其他线程
    this.notifyAll();

  }

//  -1的方法
  public synchronized void decr() throws InterruptedException {
    //    判断
    while(number != 1){
      this.wait();
    }
    number--;
    System.out.println(Thread.currentThread().getName() + "::" + number);
    this.notifyAll();
  }
}

//第三步：创建多线程
public class ThreadDemo1 {

  public static void main(String[] args) {

    share share = new share();

    new Thread(() -> {
      try {
        for (int i = 0;i<10;i++){
          share.incr();
        }
      } catch (InterruptedException e) {
        e.printStackTrace();
      }
    },"AA").start();

    new Thread(() -> {
      try {
        for (int i = 0;i<10;i++){
          share.decr();
        }
      } catch (InterruptedException e) {
        e.printStackTrace();
      }
    },"BB").start();

    new Thread(() -> {
      try {
        for (int i = 0;i<10;i++){
          share.decr();
        }
      } catch (InterruptedException e) {
        e.printStackTrace();
      }
    },"CC").start();

  }
}
